//
//  EmotionIconPackge.swift
//  EmotionKeyBoard--01
//
//  Created by FelixYin on 15/7/8.
//  Copyright © 2015年 felixios. All rights reserved.
//

import UIKit

class EmotionIconPackge: NSObject {
    
    //每个表情包存在的目录
    
    var id:String?
    
    //表情包的名字
    
    var group_name:String?
    
    //表情数组
    
    var emotionIcons:[EmotionIcon]?
    
    init(id: String) {
        
        super.init()
        
        self.id = id
        
    }
    
    //添加使用的过的表情(这一个方法只有最近表情包会调用)
    
    func addMyFavoriteEmotionIcon (emotionIcon:EmotionIcon) ->Void {
    
        //判断是否存在次表情
        
        let contain = self.emotionIcons!.contains(emotionIcon)
        
        if !contain {
        
            self.emotionIcons!.append(emotionIcon)
        
        }
        
        
        //重新将表情进行排序
        
        var result = self.emotionIcons
        
        result = result!.sort({ (e1, e2) -> Bool in
            
            e1.times > e2.times
            
        })
        
        
        //删除空白的表情（也就是每添加一个新的表情，都会移除一个空白的表情，而且可以保持最近表情最多可以存21个）
       
        //比较巧妙的一种做法
        
        if !contain {
        
           result?.removeLast()
            
        }
        
        
        //将排序后的表情数组重新设置给表情数组
        
        self.emotionIcons = result
        
        
    
    }
    
    
    //解析表情包列表，循环创建表情包对象
    
    class func emotionIconPackge() -> [EmotionIconPackge]{
        
        //创建一个表情包数组
        
        var packges = [EmotionIconPackge] ()
        
        //添加一个空表情包
        
        let emptyPackge = EmotionIconPackge(id: "empty")
        
        emptyPackge.group_name = "最近"
        
        emptyPackge.addEmptyEmotionIcon()
        
        packges.append(emptyPackge)
        
        
        //获取bundle下emoticons.plist路径
        
        let bPath = NSBundle.mainBundle().pathForResource("emoticons", ofType: "plist", inDirectory: "Emoticons.bundle")!
        
        let packgeInfo = NSDictionary(contentsOfFile: bPath)!
        
        let packgeDict = packgeInfo["packages"] as! [[String:AnyObject]]
        
        
        for packge in packgeDict {
          
            let p = EmotionIconPackge(id: packge["id"] as! String)
            
            //想打印函数的返回值需要调用才打印
            
            let emotioniconInfo = p.IDPathInEmoticons()
            
            
            //调用解析方法
            let emotionicons = p.paseIDPathInfoPlist(emotioniconInfo)
            
            
            p.emotionIcons = emotionicons
            
            //添加完存在的表情之后，追加空表情
            
            p.addEmptyEmotionIcon()
            
            
            packges.append(p)
        
        }
        
        return packges
    }
    
    
    //解析单独ID下的plist文件
    
    private func paseIDPathInfoPlist (path:String) -> [EmotionIcon] {
        
        var emotionicons = [EmotionIcon] ()
    
       let infoDict = NSDictionary(contentsOfFile: path)!
        
        //设置组名
        
       self.group_name = infoDict["group_name_cn"] as? String
        
        //拿到表情数组  infoDict["emoticons"]数组中的字典值都是string
        
        let array = infoDict["emoticons"] as! [[String:String]]
        
        //字典转模型
        
        var index = 0
        
        for eDict in array {
            

            index++
            
            emotionicons.append(EmotionIcon(id: self.id!, dict: eDict))
            
            //到第21个表情时追加一个删除表情，追加顺序影响添加删除表情的位置
            
            if index == 20 {
               
               index = 0
                
               emotionicons.append(EmotionIcon(isRemoveBtn: true))
            
            }
        
        
        }
        
        return emotionicons
    
    }
    
    
    //向每一个表情数组中追加空的表情(在原有的基础上追加)
    
    private func addEmptyEmotionIcon () -> Void {
    
        //这种情况在最近表情为空的情况下使用
        if self.emotionIcons == nil {
        
           emotionIcons = [EmotionIcon] ()
        }
        
        let count = emotionIcons!.count % 21
        
        
        if emotionIcons!.count == 0 || count > 0{
        
            //在原有的基础上追加空表情
            
            for _ in count..<20{
            
                emotionIcons?.append(EmotionIcon(isRemoveBtn: false))
            
            }
            
            //在最后添加一个删除按钮
            
            emotionIcons!.append(EmotionIcon(isRemoveBtn: true))
        
        }
        

    }
    
    
    
    //获取Emoticons.bundle的路径
    
   class private func bundlePath () -> String {
    
    
       return NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent("Emoticons.bundle")
    }
    
    
    //创建单独的函数获取指定id下plist的路径
    
    private func IDPathInEmoticons () -> String {
    
    
       return EmotionIconPackge.bundlePath().stringByAppendingPathComponent(self.id!).stringByAppendingPathComponent("Info.plist")
    }
    

}

//单个表情对象

class EmotionIcon: NSObject {
    
    //emoji字符编码,在kvc时，unicode编码需要转换
    
    var code:String? {
    
        didSet{
        
            // 1. 扫描器，可以扫描指定字符串中特定的文字
            let scanner = NSScanner(string: code!)
            
            // 2. 扫描整数 Unsafe`Mutable`Pointer 可变的指针，要修改参数的内存地址的内容
            var result: UInt32 = 0
            scanner.scanHexInt(&result)
            
            // 3. 生成字符串：UNICODE 字符 -> 转换成字符串
            emoji = "\(Character(UnicodeScalar(result)))"
        
        }
    
    }
    
    //转换后的unicode
    
    var emoji:String?
    
    //表情字符串
    
    var chs:String?
    
    //表情png
    
    var png:String?
    
    //表情gif
    
    var gif:String?
    
    //增加一个表情id,就为了后面拿到，表情图片的地址
    
    var id:String?
    
    //增加删除表情
    
    var isRemoveBtn:Bool = false
    
    //记录表情使用的次数
    
    var times:Int = 0
    
    //增加一个png路径计算型属性
    
    var pngURL:String? {
    
    
        return png == nil ? nil : EmotionIconPackge.bundlePath().stringByAppendingPathComponent(id!).stringByAppendingPathComponent(png!)
    }
    
    //添加一个gif路径计算型属性
    
    var gifURL:String? {
    
    
        return gif == nil ? nil : EmotionIconPackge.bundlePath().stringByAppendingPathComponent(id!).stringByAppendingPathComponent(gif!)
    }
    
    
    //字典转模型
    
    init(id:String?,dict:[String:AnyObject]) {
        
        
        super.init()
        
        self.id = id
        
        self.setValuesForKeysWithDictionary(dict)
        
    }
    
    //实例化删除表情
    
    init (isRemoveBtn:Bool) {
        
        super.init()
    
        self.isRemoveBtn = isRemoveBtn
    }
    
    
    //实现了此方法，会过滤掉字典中对象中不存在的属性
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    
    
    
    
    
    
    
    
    
}
